package p23_类型转换与绑定;


import org.springframework.beans.TypeConverter;
import org.springframework.boot.convert.ApplicationConversionService;
import org.springframework.core.convert.ConversionService;

import java.math.BigDecimal;
import java.util.Date;

public class _1_类型转换接口 {
    public static void main(String[] args) {
        /**
         * 第一套底层接口的成员如下所示:
         *  1. org.springframework.format.Formatter(继承了Printer和Parser接口)
         *  2. org.springframework.core.convert.ConversionService接口
         *  3. org.springframework.core.convert.converter.Converter接口
         * 其作用:
         *  1.Printer: 把其他类型转换成String
         *  2.Parser: 把String转为其他类型
         *  3.Formatter: 综合Printer和Parser的功能， String <----> 其他类型
         *  4.Converter: 把类型S转为类型T
         *  5.ConversionService: 其他三个(四个?)接口会被适配器转换成GenericConverter后，被收集成一个集合(Converters)，ConversionService使用Converters来进行具体的转换操作
         *      FormattingConversionService是ConversionService实现(内部持有了Converters)
         */
        ConversionService service = new ApplicationConversionService();
        BigDecimal convert = service.convert("121.2121", BigDecimal.class);
        System.out.println(convert);

        /**
         * 第二套转换接口成员
         *   1. java.beans.PropertyEditor(JDK提供):将String与其他类型互相转换
         *   2. org.springframework.beans.PropertyEditorRegistry：注册多个PropertyEditor的注册中心
         *  与第一套接口可以通过FormatterPropertyEditorAdapter来适配
         */
        //PropertyEditorRegistry

        /**
         * 高层转换接口
         * org.springframework.beans.TypeConverter: 转换接口接口的顶层接口，它有四个实现类
         *  1.SimpleTypeConverter
         *  2.BeanWrapperImpl
         *  3.DirectFieldAccessor
         *  4.DataBinder(常用的是其子类ServletRequestDataBinder、WebDataBinder)
         * 这个四个实现都依赖了TypeConverterDelegate，TypeConverterDelegate会委派ConversionService与PropertyEditorRegistry来执行类型转换操作
         * 所以高层转换接口，本质是调用了底层转换接口，这体现了门面模式
         * 高层转换逻辑:
         *  1.首先看PropertyEditorRegistry里面又没有自定义转换器(@InitBinder添加的转换器)
         *  2.再看又没有ConversionService转换
         *  3.再看默认的PropertyEditorRegistry能不能用
         *  4.最后有一些特殊处理
         */
        //TypeConverter
    }
}
